/**
 * @file imagenpgm.h
 * @brief T.D.A. Imagen PGM
 *
 * @author Antonio Ruano Cuesta
 * @date Mayo-06
 */
 
 /* Copyright 2010 Antonio Ruano Cuesta
 *
 * This program is free software: you can redistribute it and/or modify it under 
 * the terms of the GNU General Public License as published by the Free Software 
 * Foundation, either version 3 of the License, or (at your option) any later 
 * version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT 
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with 
 * this program. If not, see <http://www.gnu.org/licenses/>
*/

#ifndef IMAGENPGM
#define IMAGENPGM

/** Tipo byte (pixeles de la imagen) declarado como unsigned char ya que el rango de valores 
  * necesario es de 0 a 255.
  */
typedef unsigned char byte;

/**
 * A continuación procederé a construir la clase imagen PGM, que no es más que una matriz 
 * bidimensional en la que se guardarán los niveles de grises de los que constará dicha 
 * imagen. 
 * La clase, en su parte privada, está compuesta por un puntero a puntero a byte(unsigned 
 * char) que será el encargado de crear la matriz en memoria dinámica y dos enteros (filas 
 * y cols) que almacenarán las filas y columnas de las que consta la imagen en cada momento.
*/
class ImagenPGM{

  private:

	/**
       * @page repConjunto Rep del TDA Imagen PGM
       *
       * @section invConjunto Invariante de la representación
       *
       * El invariante es \e rep.filas>0 y rep.cols>0      
    */

    int filas; /**Filas de las que consta la imagen*/
    
	int cols; /**Columnas de las que consta la imagen*/
    
	byte **img;	/**Puntero a puntero encargado de la reserva de memoria */ 

  public:
		
	/**
     * @brief Constructor por defecto de la clase. Pone todos sus campos 
     * filas, cols e img a 0.
    */
    ImagenPGM();
		
	/**
     * @brief Constructor de la clase.
     * @param filas: número de filas de la imagen a crear.
     * @param cols: número de columnas de la imagen a crear.
     * @return crea una imagen con fil filas y col columnas, dejando sus elementos
     * con valores "basura".
     * @pre filas y cols mayores que 0.
    */	
    ImagenPGM(int filas, int cols);
		
	/**
     * @brief Constructor de copias de la clase.
     * @param im imagen de la que se va a hacer la copia.
    */
	ImagenPGM(const ImagenPGM &im);
		
	/**
     * @brief Destructor: libera la memoria reservada para la imagen PGM.
    */
	~ImagenPGM();
		
	/**
     * @brief Asigna una imagen PGM (im) a una variable del tipo Imagen PGM.
     * @param im imagen a asignar al objeto implícito.
	*/
	ImagenPGM& operator=(const ImagenPGM &im);

	/**
	 * @brief Función que consulta el número de filas.
	 * @return Devuelve el número de filas de las que consta una imagen PGM.
	*/
	int num_filasPGM() const;

	/**
	 * @brief Función que consulta el número de columnas.
	 * @return Devuelve el número de columnas de las que consta una imagen PGM.
	*/
	int num_columnasPGM() const;

	/**
	 * @brief Asigna un nivel de gris a una determinada posición.
	 * @param fila: fila en la que se quiere insertar el nivel de gris.
	 * @param col: columna en la que se quiere insertar el nivel de gris.
	 * @param valor: nivel de gris a introducir en la posición indicada.
	 * @pre 	0<=fila<num_filasPGM()
	 * 			0<=col<num_columnasPGM()
	 * 			0<=valor<=255
	*/
	void set_pixPGM(int fila, int col, byte valor);

	/**
	 * @brief Consulta el valor de una determinada posición de la imagen.
	 * @param fila: fila a consultar.
	 * @param col: columna a consultar.
	 * @pre 0<=fila<num_filas()
	 * 			0<=col<num_columnas()
	 * @return luminosidad (nivel de gris) de la posición indicada (devuelve tipo unsigned 
	 * char).
	*/
	byte get_pixPGM(int fila, int col) const;

	/**
 	* @brief Inserta una imagen de tipo PGM en el objeto de la clase.
 	* @param nombre: nombre del archivo a leer de disco.
 	*/
	void InsertaImagenPGM(const char *nombre);

	/**
 	* @brief Guarda en disco la imagen PGM que se encuentra almacenada en el objeto de la 
	* clase.
 	* @param nombre: nombre del archivo a escribir en disco.
	* @return true si la imagen se ha guardado con éxito, false en caso contrario.
 	*/
	bool EscribeImagenPGM(const char *nombre);
};



#endif
